package com.hama.zea.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ValidatorUtil {

	
	
	
	public static boolean valIdCard(String cardId){
		
		if(!StrUtil.isDigitalString(cardId.substring(0,17))){
			return false;//判断前17位要为数字-------false
		}
		else if(!StrUtil.isDigitalString(cardId.substring(17))&&!cardId.substring(17).equalsIgnoreCase("X")){
			return false;//判断最后一位如果不是数字 并且 不是X ------false
		}	 
		Date d = new Date();
		DateFormat df=new SimpleDateFormat("yyyyMMdd");
		int year = Integer.parseInt(df.format(d));
		if(Integer.parseInt(cardId.substring(6,10))<1900||Integer.parseInt(cardId.substring(6,10))>year){
			return false;//年份小于1900 或者年份大于当前年份--------false
		}
		if(Integer.parseInt(cardId.substring(10,12))<1||Integer.parseInt(cardId.substring(10,12))>12){
			return false;//表示月份的小于1或者月份大于12-------false
		}
		if(Integer.parseInt(cardId.substring(12,14))<1||Integer.parseInt(cardId.substring(12,14))>31){
			return false;//表示日的小于1或者大于31的--------false
		}
		
		//校验第18位
		//S = Sum(Ai * Wi), i = 0, ... , 16 ，先对前17位数字的权求和 
		//Ai:表示第i位置上的身份证号码数字值 
		//Wi:表示第i位置上的加权因子 
		//Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 

		String[] tempA  = cardId.split("|");
		for(int i=0; i<tempA.length;i++){
			System.out.println("cardId"+i+"="+tempA[i]);
		}
		int[] a = new int[18];   //
		for(int i=0;i<tempA.length-2;i++){
			//a[i] = cardId.charAt(i)-48;
			a[i] = Integer.parseInt(tempA[i+1]);
			System.out.println("a"+i+"="+a[i]);		
		}
		
		int[] w = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};  //加权因子
		
		int sum = 0;
		for(int i=0;i<17;i++){
			sum = sum+a[i]*w[i];
		}
		//Y = mod(S, 11) 
		//通过模得到对应的校验码 
		//Y:     0 1 2 3 4 5 6 7 8 9 10 
		//校验码: 1 0 X 9 8 7 6 5 4 3 2

		String[] v = {"1","0","x","9","8","7","6","5","4","3","2"}; //校验码
		int y = sum%11;
		//System.out.println("sum="+sum+" y="+y);
		//System.out.println("v"+y+"="+v[y]+"  a17="+cardId.substring(17));
		if(!v[y].equalsIgnoreCase(cardId.substring(17))){
			return false;
		}
		
		return true;
	}
	
}
